package com.vm.myview;

import java.io.File;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Toast;
import com.vm.broadcast.AppInstallReceiver;
import com.vm.commons.CurrentSetting;
import com.vm.commons.ProgressUtil;
import com.vm.commons.StringUtil;
import com.vm.db.DownInfoDao;
import com.vm.model.ActiveSoft;
import com.vm.model.DownInfo;
import com.vm.model.Soft;
import com.vm.utils.ConnectManager;
import com.vm.utils.DownloadThread;
import com.vm.utils.ThreadManager;
import com.wwtscapp.apk.R;

/**
 * 
 * @ProjectName: [WeiMai]
 * @Author: [kent.wang]
 * @CreateDate: [2015年3月28日 下午2:18:14]
 * @Version: [v1.0]
 * 
 */
@SuppressLint("ShowToast")
public class DownloadProgress {

	private Context mContext;
	LinearLayout layout;
	Button btn_download;
	ProgressBar progressBar;
	RelativeLayout rlayout_info;
	RelativeLayout rlayout_progressBar;
	View view;
	private int fileSize = 0;
	private int nowProgressValue = 0;
	DownInfoDao dao;
	DownInfo apkInfo;
	ActiveSoft activeSoft;
	private DownloadThread downThread;
	private Handler downHandler;

	public DownloadProgress(Context context, View view, ActiveSoft activeSoft) {

		this.mContext = context;
		this.view = view;

		dao = new DownInfoDao(context);
		this.activeSoft = activeSoft;
		init();
		initProgressBar();
	}

	public void initProgressBar() {

		File apkfile = new File(StringUtil.getSdApkUrl(activeSoft.getName()));
		if (apkfile.exists()) {

			// 判断APK在机器的状态,正在下载,已下载,已安装
			apkInfo = dao.query(activeSoft.getSoftId());
			if (apkInfo != null) {
				progressBar.setMax(apkInfo.getApkLength());
				if (apkInfo.getDone() <= apkInfo.getApkLength()) {

					if (apkInfo.getIsPause() == 0) {
						// 下载APK
						progressBar.setProgress(ProgressUtil.hashMap
								.get(apkInfo.getSoftId()));
						rlayout_info.setVisibility(View.GONE);
						progressBar.setVisibility(View.VISIBLE);

						// currentId = v.getTag().toString();
						// Log.i(TAG, currentId);
						// System.out
						// .println("<<<<" + nowProgressValue + "<<<" +
						// fileSize);
						// progressText.setText("稍等");
						// progressText.setTextColor(Color.BLACK);
						Message msg = new Message();
						// msg.arg1 = currentId;
						msg.what = 100;
						// 下载地址
						// msg.obj = VMConst.DOWN_URL + currentId + "&userId="
						// + CurrentUser.USERID;
						Soft soft = new Soft();
						soft.setId(activeSoft.getSoftId());
						soft.setImageUrl(activeSoft.getImageUrl());
						soft.setApkUrl(activeSoft.getApkUrl());
						soft.setName(activeSoft.getName());
						msg.obj = soft;

						dao.start(activeSoft.getSoftId());

						downThread = new DownloadThread(mContext, mainHandler);
						downThread.start();

						ProgressUtil.hashMap.put(activeSoft.getSoftId(),
								nowProgressValue);

						do {
							downHandler = downThread.getDownHandler();
						} while (null == downHandler);

						downHandler.sendMessage(msg);
						btn_download.setText("暂停");
					} else {
						btn_download.setText("继续");
					}

				}
			}

		}
	}

	/**
	 * 初始化控件
	 */
	private void init() {

		btn_download = (Button) view.findViewById(R.id.btn_download);
		btn_download.setOnClickListener(downClickListener);

		progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
		rlayout_info = (RelativeLayout) view.findViewById(R.id.rlayout_info);
		rlayout_progressBar = (RelativeLayout) view
				.findViewById(R.id.rlayout_progressBar);

	}

	/**
	 * 下载按钮监听
	 */
	public OnClickListener downClickListener = new OnClickListener() {

		@Override
		public void onClick(final View v) {
			if (btn_download.getText().toString().equals("安装")) {
				v.setEnabled(false);
				// 执行安装
				Toast toast3 = Toast.makeText(mContext, "正在安装", 500);
				toast3.setGravity(Gravity.CENTER, 0, 0);
				toast3.show();

				File apkfile = new File(StringUtil.getSdApkUrl(activeSoft
						.getName()));
				if (!apkfile.exists()) {
					return;
				}
				Intent i = new Intent(Intent.ACTION_VIEW);
				i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
						"application/vnd.android.package-archive");
				view.getContext().startActivity(i);
				AppInstallReceiver.mainHandler = mainHandler;
				v.setEnabled(true);
			} else if (btn_download.getText().toString().equals("暂停")) {
				v.setEnabled(false);
				downThread.isPause = true;
				btn_download.setText("继续");
				dao.stop(activeSoft.getSoftId());
				v.setEnabled(true);
				// int a = apkInfo.getIsPause();
			}

			else {
				ConnectManager.mainHandler = downloadHandler;
				ConnectManager.isDownload(mContext);
			}
		}

	};

	public DownloadThread getDownloadThread() {
		if (downThread == null) {
			downThread = ThreadManager.getDownloadThread(
					mContext.getApplicationContext(), activeSoft.getSoftId(),
					mainHandler);

		}
		return downThread;
	}

	@SuppressLint("HandlerLeak")
	private Handler downloadHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 10:
				if (btn_download.getText().toString().equals("下载")) {
					btn_download.setEnabled(false);

					btn_download.setText("暂停");
					// 下载APK
					rlayout_info.setVisibility(View.GONE);
					progressBar.setVisibility(View.VISIBLE);

					Message msg1 = new Message();
					// msg.arg1 = currentId;
					msg1.what = 100;
					// 下载地址
					// msg.obj = VMConst.DOWN_URL + currentId +
					// "&userId="
					// + CurrentUser.USERID;
					Soft soft = new Soft();
					soft.setId(activeSoft.getSoftId());
					soft.setImageUrl(activeSoft.getImageUrl());
					soft.setApkUrl(activeSoft.getApkUrl());
					soft.setName(activeSoft.getName());
					msg1.obj = soft;
					downThread = getDownloadThread();

					ProgressUtil.hashMap.put(activeSoft.getSoftId(),
							nowProgressValue);
					do {
						downHandler = downThread.getDownHandler();
					} while (null == downHandler);
					downHandler.sendMessage(msg1);

					btn_download.setEnabled(true);

				} else if (btn_download.getText().toString().equals("继续")) {
					btn_download.setEnabled(false);
					if (downThread != null) {
						if (downThread.isPause) {
							downThread.isPause = false;
							downThread.restart();
							// downThread.dao.notify();
						}
					} else {
						rlayout_info.setVisibility(View.GONE);
						progressBar.setVisibility(View.VISIBLE);

						Soft soft = new Soft();
						soft.setId(activeSoft.getSoftId());
						soft.setImageUrl(activeSoft.getImageUrl());
						soft.setApkUrl(activeSoft.getApkUrl());
						soft.setName(activeSoft.getName());
						Message msg1 = new Message();
						msg1.what = 100;
						msg1.obj = soft;

						downThread = getDownloadThread();
						dao.start(activeSoft.getSoftId());

						ProgressUtil.hashMap.put(activeSoft.getSoftId(),
								nowProgressValue);
						if (downHandler == null) {
							downHandler = downThread.getDownHandler();
						}
						downHandler.sendMessage(msg1);
					}
					btn_download.setText("暂停");
					btn_download.setEnabled(true);
				}
				break;
			}
		}
	};
	@SuppressLint("HandlerLeak")
	private Handler mainHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 100:
				rlayout_info.setVisibility(View.VISIBLE);
				progressBar.setVisibility(View.GONE);
				btn_download.setText("已安装");
				// 发送增加记录到数据库执行增加下载记录
				if (CurrentSetting.autodelete == 1) {
					File apkfile = new File(Environment
							.getExternalStorageDirectory().getPath()
							+ "/vmclient/" + activeSoft.getName() + ".apk");
					if (apkfile.exists()) {
						apkfile.delete();
					}
				}
				break;
			case 200:
				break;

			case 500:
				if (nowProgressValue <= fileSize) {

					fileSize = msg.arg1;
					progressBar.setMax(fileSize);
					new Thread() {
						@Override
						public void run() {
							while (true) {
								progressBar.setProgress(nowProgressValue);
							}
						}
					}.start();
					// }
				} else {
					Toast toast = Toast.makeText(mContext, "当前附件已下载", 500);
					toast.setGravity(Gravity.CENTER, 0, 0);
					toast.show();
				}

				break;
			case 600:
				nowProgressValue = msg.arg1;
				ProgressUtil.hashMap.put(activeSoft.getSoftId(),
						nowProgressValue);
				break;
			case 700:
				Toast toast = Toast.makeText(mContext, "网络异常或当前附件不存在", 500);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
				break;
			case 800:
				Toast toast1 = Toast.makeText(mContext, "URL异常，请联系管理员", 500);
				toast1.setGravity(Gravity.CENTER, 0, 0);
				toast1.show();
				break;
			case 900:
				Toast toast2 = Toast.makeText(mContext, "暂停下载", 500);
				toast2.setGravity(Gravity.CENTER, 0, 0);
				toast2.show();
				break;
			case 1000:
				Toast toast3 = Toast.makeText(mContext, "下载完成", 500);
				toast3.setGravity(Gravity.CENTER, 0, 0);
				toast3.show();
				btn_download.setText("安装");

				dao.complete(activeSoft.getSoftId());
				File apkfile = new File(StringUtil.getSdApkUrl(activeSoft
						.getName()));
				if (!apkfile.exists()) {
					return;
				}

				AppInstallReceiver.mainHandler = mainHandler;
				if (CurrentSetting.autoinstall == 1) {
					Intent i = new Intent(Intent.ACTION_VIEW);

					i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
							"application/vnd.android.package-archive");
					view.getContext().startActivity(i);
				}
				new NotificationView(view.getContext(),
						activeSoft.getImageUrl(),
						activeSoft.getName() + "下载完成", "点击安装", "下载完成",
						apkfile.toString());
				if (CurrentSetting.zeroflow == 1) {
					SoundPool pool = new SoundPool(10,
							AudioManager.STREAM_MUSIC, 5);
					// 载入音频流，返回在池中的id
					final int sourceid = pool.load(mContext, R.raw.down, 0);
					pool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

						@Override
						public void onLoadComplete(SoundPool soundPool,
								int sampleId, int status) {
							// TODO Auto-generated method stub
							soundPool.play(sourceid, 2, 2, 0, 0, 1);
						}

					});
				}
				break;
			default:
				break;
			}
			super.handleMessage(msg);
		}
	};

}
